1394 stories
·
0 followers

County With 37 Data Centers Asks Schools To 'Conserve Electricity'

1 Share
An anonymous reader quotes a report from 404 Media: On June 26, the County Manager of Henrico County, Virginia, John Vithoulkas, sent an email to thousands of county employees asking them to help the local government conserve electricity. "Beginning July 1st, the rate we pay for electricity used in all Henrico County government and school facilities will increase dramatically -- by 25%, increasing costs by an estimated $5 million next fiscal year. We anticipate more rate increases for electricity in the years ahead," a copy of the email obtained by 404 Media said (emphasis his). Henrico County is a community of more than 350,000 people in eastern Virginia just outside of Richmond. It also hosts 37 data centers and there are plans to build 17 more, including plans to convert hundreds of acres of Civil War battlefields into data centers. Thanks to its proximity to DC and vast amounts of land, Henrico County became a data center hub seemingly overnight and its services clients big and small. Meta built a data center there in 2017. "To mitigate the impact of higher electric costs, I am asking that we, collectively, make slight adjustments to conserve electricity across our individual workspaces," Vithoulkas wrote in the email. "Turn off your lights when leaving your workspace, including when you leave for the day. Turn off your computers/laptops at the end of each workday. If your workspace has windows, adjust the blinds to manage heat from sunlight. Unplug any appliances, chargers, or other electrical items when they are not in use. Please limit use of (or refrain altogether from using) space heaters. A typical space heater alone can cost the county from $150 to $300 per year in electricity costs." "Each dollar we can save by conserving electricity is another dollar the county can reinvest into staff and the services we provide our residents," Vithoulkas email said.

Read more of this story at Slashdot.

Read the whole story
Share this story
Delete

Automating your Visual Studio extension builds with GitHub Actions

2 Shares

If you’re building and maintaining Visual Studio extensions, you’ve probably ended up with some sort of build and publishing workflow – whether it’s manual, scripted, or stitched together over time.

This post is for extension authors who want a simple, repeatable way to build, version, and publish their VSIX files using GitHub Actions.

I’m going to show how I do this across my own extensions.

github action publish image

I’ve been using this approach for a long time, and over time I pulled the most repetitive pieces into a few small reusable actions, so I don’t have to keep rewriting the same logic in every repo.

Those are:

  • vsix-version-stamp – keeps your versioning in sync
  • publish-vsixgallery – publishes CI builds for testing
  • publish-marketplace – publishes to the Visual Studio Marketplace

You can use them independently or together, but I tend to use all three.

If you want to see this wired up in a real repo, take a look at Start Screen.

A real workflow

Here’s a simplified setup very similar to what I use across my extensions today:

name: Build
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: windows-latest

    env:
      Configuration: Release
      VsixManifestPath: src\source.extension.vsixmanifest
      VsixSourcePath: src\source.extension.cs

    steps:
      - uses: actions/checkout@v6

      - name: Setup MSBuild
        uses: microsoft/setup-msbuild@v3

      - name: Restore
        run: msbuild /t:Restore

      - name: Version stamp
        uses: madskristensen/vsix-version-stamp@v2
        with:
          manifest-file: ${{ env.VsixManifestPath }}
          vsix-token-source-file: ${{ env.VsixSourcePath }}

      - name: Build
        run: msbuild /p:Configuration=$(Configuration)

      - name: Publish to VSIX Gallery
        uses: madskristensen/publish-vsixgallery@v1
        with:
          vsix-file: '**/*.vsix'

      - name: Publish to Marketplace
        uses: madskristensen/publish-marketplace@v2
        with:
          extension-file: '**/*.vsix'
          publish-manifest-file: vs-publish.json
          personal-access-code: ${{ secrets.VS_MARKETPLACE_TOKEN }}

This is essentially the full pipeline – version, build, package, and publish.

From here, you can tweak when publishing happens (for example, only on releases), but the core setup tends to stay the same.

Keeping your version in sync

Versioning is one of those things that’s easy to get wrong.

The vsix-version-stamp action updates your version during the build, so you don’t have to think about it.

It works especially well together with the VSIX Synchronizer extension, which generates a .cs file from your .vsixmanifest.

That gives you:

  • A single source of truth
  • Version available in code
  • No manual edits before publishing

It’s completely optional, but once you start using it, it tends to stick.

Publishing to the Visual Studio Marketplace

Once you have a VSIX, publishing it to the Marketplace is straightforward.

You only need a single secret:

  • VS_MARKETPLACE_TOKEN
- name: Publish to Marketplace
  uses: madskristensen/publish-marketplace@v2
  with:
    extension-file: '**/*.vsix'
    publish-manifest-file: vs-publish.json
    personal-access-code: ${{ secrets.VS_MARKETPLACE_TOKEN }}

That’s it.

The VSIX contains the extension metadata, and the publish manifest fills in the rest.

Publishing to a VSIX Gallery (for CI builds and testing)

The publish-vsixgallery action serves a different purpose.

It’s for quickly sharing builds.

I primarily use it when I want someone to try out a fix or validate a change before it goes to the Marketplace.

- name: Publish to VSIX Gallery
  uses: madskristensen/publish-vsixgallery@v1
  with:
    vsix-file: '**/*.vsix'

That’s what VSIX galleries are great for – fast, lightweight distribution without the overhead of a full release.

Works with your own gallery too

VSIX Gallery is open source, so you can host your own instance if you want.

The GitHub Action supports a configurable gallery-url, so it’s not tied to a specific hosted gallery.

- name: Publish to VSIX Gallery
  uses: madskristensen/publish-vsixgallery@v1
  with:
    vsix-file: '**/*.vsix'
    gallery-url: 'https://your-gallery.example.com'

That lets you use the same workflow whether you’re targeting a public gallery or something you host yourself.

Mixing and matching

You don’t have to use all three actions.

Some common setups:

Minimal

  • Build + Marketplace publish

CI-focused

  • Build + VSIX Gallery publish

Full pipeline

  • Version stamping + build + gallery + Marketplace

Use what fits your workflow.

When to use what

  • VSIX Gallery Use this for testing, sharing builds, and quick validation
  • Visual Studio Marketplace Use this for official releases

Most extensions benefit from using both:

  • CI builds go to a gallery
  • Stable builds go to the Marketplace

Wrap-up

This is the setup I use across my extensions.

It keeps things predictable, makes it easy to share builds, and removes most of the repetitive steps from the release process.

You don’t need to adopt all of it. Start with the parts that make sense for your workflow and build from there.

The post Automating your Visual Studio extension builds with GitHub Actions appeared first on Visual Studio Blog.

Read the whole story
Share this story
Delete

The evolution of window and class extra bytes in Windows

2 Shares

Windows provides a family of functions for accessing so-called “extra bytes”. There are two categories of extra bytes: Class extra bytes (which belong to the window class) and window extra bytes (which belong to each window created from that class). Applications can request extra bytes at class registration, and those are accessed at increasing offsets starting at zero. The system also defines a number of extra bytes, and those use negative offsets.

We’re going to look at the system-defined offsets.

In 16-bit Windows, these were the available extra bytes and the function you used to read them:

Name Size Accessor Notes
GCW_MENUNAME int16_t GetClassWord  
GCW_HBRBACKGROUND int16_t GetClassWord  
GCW_HCURSOR int16_t GetClassWord  
GCW_HICON int16_t GetClassWord  
GCW_HMODULE int16_t GetClassWord  
GCW_CBWNDEXTRA int16_t GetClassWord  
GCW_CBCLSEXTRA int16_t GetClassWord  
GCL_WNDPROC int32_t GetClassLong  
GCW_STYLE int16_t GetClassWord  
GCW_ATOM int16_t GetClassWord Added in Windows 3.1
GWL_WNDPROC int32_t GetWindowLong  
GWW_HINSTANCE int16_t GetWindowWord  
GWW_HWNDPARENT int16_t GetWindowWord  
GWW_ID int16_t GetWindowWord  
GWL_STYLE int32_t GetWindowLong  
GWL_EXSTYLE int32_t GetWindowLong Added in Windows 3.0
DWL_MSGRESULT int32_t GetWindowLong For dialog windows
DWL_DLGPROC int32_t GetWindowLong For dialog windows
DWL_USER int32_t GetWindowLong For dialog windows

There is clearly a naming pattern here for class and window bytes.

The first letter G stands for Get. The second letter C or W stands for Class or Window. And the third letter W or L stands for Word or Long

For window bytes that apply only to dialog windows, the first letter changes to D for “dialog”. These values are zero or positive, since they are really just extra bytes registered to the standard dialog class.

Now, in 16-bit Windows, handles were 16-bit values, but in 32-bit Windows, they expand to 32-bit values, so 32-bit Windows changed the functions from Get­Something­Word to Get­Something­Long, and the prefixes correspondingly changed from W to from L. So our table now looks like this:

Name 16-bit prefix/size 32-bit prefix/size
MENUNAME GCW_ int16_t GCL_ int32_t ◱
HBRBACKGROUND GCW_ int16_t GCL_ int32_t ◱
HCURSOR GCW_ int16_t GCL_ int32_t ◱
HICON GCW_ int16_t GCL_ int32_t ◱
HMODULE GCW_ int16_t GCL_ int32_t ◱
CBWNDEXTRA GCW_ int16_t GCL_ int32_t ◱
CBCLSEXTRA GCW_ int16_t GCL_ int32_t ◱
WNDPROC GCL_ int32_t GCL_ int32_t ◱
STYLE GCW_ int16_t GCL_ int32_t ◱
ATOM GCW_ int16_t GCW_ int16_t
HICONSM   GCL_ int32_t 💥
WNDPROC GWL_ int32_t GWL_ int32_t ◱
HWNDPARENT GWW_ int16_t GWL_ int32_t ◱
ID GWW_ int16_t GWL_ int32_t ◱
STYLE GWL_ int32_t GWL_ int32_t
EXSTYLE GWL_ int32_t GWL_ int32_t
USERDATA   GWL_ int32_t 💥
MSGRESULT DWL_ int32_t DWL_ int32_t
DLGPROC DWL_ int32_t DWL_ int32_t
USER DWL_ int32_t DWL_ int32_t

The ◱ symbol represents a value that got bigger, and the 💥 symbol represents values that did not exist in 16-bit Windows.

Even though control IDs are typically small integers, the space for them was expanded from a 16-bit value to a 32-bit value because some people were using it to hold pointers or handles. (One way to create a process-wide unique number is to allocate memory and use its address.)

The next step in the evolution of extra bytes is the conversion from 32-bit to 64-bit Windows. Pointers and handles expand to 64-bit values on 64-bit Windows, so all of the extra bytes that are used to (or could be used to) hold a handle or pointer were expanded to a 64-bit version.

To make it possible to write code that targets both 32-bit and 64-bit Windows, the design of 64-bit Windows didn’t make the hard break that 32-bit Windows did from 16-bit Windows. Instead, they introduced new functions that accept pointer-sized integers, which are 32-bit values on 32-bit Windows and 64-bit values on 64-bit Windows. That way, you just use those new functions everywhere, and they will expand on 64-bit systems and remain the same on 32-bit systems.

The new functions have names like Get­Window­Long­Ptr, and the corresponding prefixes were changed to GWLP_ and so on.

Name 16-bit prefix/size 32-bit prefix/size 32/64-bit prefix/size
MENUNAME GCW_ int16_t GCL_ int32_t ◱ GCLP_ intptr_t ◱
HBRBACKGROUND GCW_ int16_t GCL_ int32_t ◱ GCLP_ intptr_t ◱
HCURSOR GCW_ int16_t GCL_ int32_t ◱ GCLP_ intptr_t ◱
HICON GCW_ int16_t GCL_ int32_t ◱ GCLP_ intptr_t ◱
HMODULE GCW_ int16_t GCL_ int32_t ◱ GCLP_ intptr_t ◱
CBWNDEXTRA GCW_ int16_t GCL_ int32_t ◱ GCL_ int32_t
CBCLSEXTRA GCW_ int16_t GCL_ int32_t ◱ GCL_ int32_t
WNDPROC GCL_ int32_t GCL_ int32_t ◱ GCLP_ intptr_t ◱
STYLE GCW_ int16_t GCL_ int32_t ◱ GCL_ int32_t
ATOM GCW_ int16_t GCW_ int16_t GCW_ int16_t
HICONSM   GCL_ int32_t 💥 GCLP_ intptr_t ◱
WNDPROC GWL_ int32_t GWL_ int32_t ◱ GWLP_ intptr_t ◱
HWNDPARENT GWW_ int16_t GWL_ int32_t ◱ GWLP_ intptr_t ◱
ID GWW_ int16_t GWL_ int32_t ◱ GWLP_ intptr_t ◱
STYLE GWL_ int32_t GWL_ int32_t GWL_ int32_t
EXSTYLE GWL_ int32_t GWL_ int32_t GWL_ int32_t
USERDATA   GWL_ int32_t 💥 GWLP_ intptr_t ◱
MSGRESULT DWL_ int32_t DWL_ int32_t DWLP_ intptr_t ◱
DLGPROC DWL_ int32_t DWL_ int32_t DWLP_ intptr_t ◱
USER DWL_ int32_t DWL_ int32_t DWLP_ intptr_t ◱

From the prefix on the name of the extra bytes, you can read off which function it is meant to be used with.

Prefix Function
GCW_ ↔ GetClassWord GWW_ ↔ GetWindowWord
GCL_ ↔ GetClassLong GWL_ ↔ GetWindowLong
GCLP_ ↔ GetClassLongPtr GWLP_ ↔ GetWindowLongPtr

The weirdo is DWLP_ because it needs to encode both the type of window that it can be used with (D = dialog) as well as the function name it goes with (WindowLongPtr).

As a concession, Windows lets you pass GCL_ and GWL_ values to Get­Class­Long­Ptr and Get­Window­Long­Ptr (respectively) even though they are intended to be used with Get­Class­Long and Get­Window­Long (respectively). If you do that, you get the corresponding 32-bit value zero-extended if necessary to be the size of a pointer.² This is seen primarily in the case of GWL_ID because most people don’t use the full range of IDs, so if you’re willing to live within the 32-bit subset, you can just pretend that the values are not pointer-sized.³

“Why bother changing all the prefixes? Doesn’t that just create a lot of busy work for people porting from 32-bit code to 64-bit code?”

Yes, but it’s good busy work. The point is to force build breaks at places where you need to make fixes, because you have to call the function that accesses a pointer-sized integer rather than a 32-bit integer; otherwise you suffer from integer truncation bugs.

¹ This is a common prefixing convention for classic Win32. For example, the operation parameter to Show­Window is prefixed SW_; the flags to Set­Window­Pos are prefixed SWP_; and the relationship parameter for Get­Window is prefixed GW_.

² The use of the GWL_ values with Set­Window­Long­Ptr is a bit more problematic. It looks like you’re storing a pointer-sized integer, but only the bottom 32 bits are honored.

³ The ID is unusual in that it is defined both as GWL_ID and GWLP_ID. All of the other values are defined with only one prefix.

The post The evolution of window and class extra bytes in Windows appeared first on The Old New Thing.

Read the whole story
Share this story
Delete

Ford Rehires 'Gray Beard' Engineers After AI Falls Short

1 Share
Ford executives said they've hired 350 veteran engineers — some of them former employees — after AI and automated systems failed to deliver the desired quality, reports TechCrunch: Bloomberg reports the company's chief operating officer Kumar Galhotra told journalists that Ford had been "relying more and more on automated quality systems" with disappointing results. So the company "brought back technical specialists," and those specialists "hunt for failure points before a part ever reaches the plant floor." Charles Poon, Ford's vice president of vehicle hardware engineering, added, "Mistakenly we thought that by just introducing artificial intelligence and ingesting the design requirements that we had, that that would produce a high-quality product." The article points out that Ford is using the rehired gray beard engineers to train younger staff — and, to reprogram its AI tools.

Read more of this story at Slashdot.

Read the whole story
Share this story
Delete

FCC accused of hiding Chairman Carr's messages with DOGE and Musk

1 Share

An advocacy group trying to investigate DOGE's influence on the Federal Communications Commission accused the FCC of failing to comply with a public records request and of concealing Chairman Brendan Carr's use of the Signal messaging service.

"The evidence clearly demonstrates that the FCC has acted in bad faith by withholding documents responsive to Plaintiffs’ FOIA [Freedom of Information Act] request," journalist Nina Burleigh and advocacy group Frequency Forward said in a filing yesterday in US District Court for the District of Columbia. "The FCC acted in bad faith when it redefined the search criteria without notice to Plaintiffs or this Court. Further, the FCC acted in bad faith by concealing the fact that the Chairman Carr has a Signal account on a phone he uses to conduct government business."

Burleigh and Frequency Forward sued the FCC last year, alleging that it violated the Freedom of Information Act by wrongfully withholding agency records. In August 2025, a federal judge ordered the FCC to produce documents and criticized it for a “vague and uninformative” response to the lawsuit.

The plaintiffs filed the initial FoIA request in February 2025 for an investigation into how DOGE's activities at the FCC may have created conflicts of interest related to Elon Musk's SpaceX and Starlink, which are seeking various FCC licenses and authorizations.

"The evidence strongly suggests that Musk bought his way into the White House and to obtain his position as the de-facto head of DOGE, and that he had used his government authority and access to information to earn huge profits for himself and his companies," plaintiffs said yesterday. "Plaintiffs’ FoIA request seeks documents that shed light on the relationship between the FCC, Musk as regulator and Musk and his companies as regulated entities."

Burleigh and Frequency Forward asked the court to deny an FCC motion for summary judgment, order the agency to produce all responsive documents within a week, and allow the plaintiffs to file discovery requests. Their filing accused the FCC of having "wasted a year of the Court’s time and frustrated Plaintiffs’ efforts to timely review critical records."

The FCC "has sought to delay the production of responsive documents and obfuscate the existence of responsive records," and "made it clear that it will not undertake a good faith effort to produce responsive documents," the filing said. "Accordingly, discovery is required and will speed the document production process by helping the Plaintiffs identify responsive documents."

Carr's phone

The filing said there is evidence that Carr has Signal messaging set up on a phone he uses for FCC business. Carr's phone number was previously disclosed in a FoIA request that turned up a November 2024 email from a Fox News producer who was confirming an interview. Entering that "number into the Signal app shows that he has an active Signal account under the username 'Brendan Carr,'" the filing said.

A court filing submitted by the FCC on June 3 said that Carr did not have phone numbers for DOGE personnel and that "it is agency policy not to download additional messaging applications on FCC phones (e.g., Signal, WhatsApp)." Plaintiffs counter that Carr likely exchanged messages with Musk or other high-ranking DOGE officials.

"Plaintiffs do not know whether the number identified in Exs. 4 and 5 belongs to Carr’s personal phone or a government issued phone," the filing said. "What we do know is that a phone is being used for government business and that it has a Signal account in Carr’s name. Based on information and belief Carr regularly conducts government business through text and Signal messages, communicating with journalists, industry professional and individuals who work for regulated entities, such as Musk and SpaceX."

Plaintiffs said the FCC's statement that Carr did not have phone numbers for DOGE personnel doesn't settle the matter.

"It is unlikely that Carr would have communicated with individuals at that level. Carr would have communicated with Musk or other highly placed DOGE officials," the filing said. Plaintiffs said a previous case involving DOGE showed that "DOGE personnel routinely conducted business on their personal phones using text messages, especially the Signal app."

The filing separately accused the FCC of limiting its records search to emails with FCC, DOGE, and GSA (General Services Administration) domains, despite plaintiffs' objections. It also said that travel documents provided by the FCC did not include anything about Carr's visits to Starlink facilities.

We contacted the FCC today and will update this article if it provides any comment.

Read full article

Comments



Read the whole story
Share this story
Delete

Renewable Energy Just Hit 30% of America's Electricity Generation

1 Share
America generated 10.06% more energy with renewables in the first four months of 2026 than it did in the same period the year before. That's according to new figures from America's Energy Information Administration, cited in this report from Electrek: The growth was led by utility-scale solar (+21.3%), hydropower (+15.7%), small-scale solar In April alone, wind and solar each produced more electricity than US coal plants, while the combination of solar and wind produced 57.0% more electricity than nuclear power. The mix of all renewables, including biomass and geothermal, accounted for 30.0% of total US electrical generation during the first third of 2026 — up from 27.8% a year earlier... EIA reported that, in April, utility-scale solar capacity surpassed wind capacity for the first time (160,208.1 MW vs. 160,100.6 MW). Further, utility-scale battery energy storage capacity increased by 17,703.5 MW, or 58.1%. Nuclear added just 18.4 MW. The combined capacity growth of all utility-scale renewable energy sources for the 12-month period (55,980.3 MW) is two-thirds more (i.e., 67.6%) than that added during the previous 12 months (33,392.0 MW). "EIA projects no new nuclear generating capacity and a net decline of 5,200.5 MW in fossil fuel capacity."

Read more of this story at Slashdot.

Read the whole story
Share this story
Delete
Next Page of Stories